package com.jiyu.interceptor;

import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//判断 session 中是否存在 user 属性，如果存在就放行，如果不存在就跳转到 login 页面
public class LoginInterceptor  implements HandlerInterceptor {

    @Override
    public boolean preHandle (HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        /*
        HttpSession session = httpServletRequest.getSession();
        String contextPath=session.getServletContext().getContextPath();//项目名路径 本项目没有指定项目路径，得到的是空字符串
        //test
        //System.out.println("session.getServletContext().getContextPath()  "+session.getServletContext().getContextPath());

        String[] requireAuthPages = new String[]{//需要拦截的路径
                "index",
        };

        String uri = httpServletRequest.getRequestURI();//请求路径（根路径到地址结尾）  URL:获取请求的地址链接（浏览器中输入的地址）
        //test
        //System.out.println("httpServletRequest.getRequestURI()   "+httpServletRequest.getRequestURI());

        uri = StringUtils.remove(uri, contextPath+"/");//  路径中所有的 /  都会被移除

        String page = uri;

        if(beginWith(page, requireAuthPages)){//以 /index 开头的路径都会被转发，包括 index.html
            User user = (User) session.getAttribute("user");
            if(user==null) {
                httpServletResponse.sendRedirect("login");
                return false;
            }
        }
        */

        // 放行 options 请求，否则无法让前端带上自定义的 header 信息，导致 sessionID 改变，shiro 验证失败
        //跨域情况下会先发出一个 options 请求试探，这个请求是不带 cookie 信息的，所以 shiro 无法获取到 sessionId，将导致认证失败。
        if (HttpMethod.OPTIONS.toString().equals(httpServletRequest.getMethod())) {
            httpServletResponse.setStatus(HttpStatus.NO_CONTENT.value());
            return true;
        }

        Subject subject = SecurityUtils.getSubject();
        // 使用 shiro 验证
        if (!subject.isAuthenticated() && !subject.isRemembered()){
            System.out.println("拦截器运行中……");

            return false;
        }

        return true;
    }

    //遍历需要拦截的路径，只要page以requiredAuthPage开头就拦截
    private boolean beginWith(String page, String[] requiredAuthPages) {
        boolean result = false;
        for (String requiredAuthPage : requiredAuthPages) {
            if(StringUtils.startsWith(page, requiredAuthPage)) {
                result = true;
                break;
            }
        }
        return result;
    }
}